#include "delay.h"

volatile uint32_t __timeout_count = 0;

// 粗延时（软件延时，不精确）
void sleep(void)
{
	volatile int i = 0x4000000;
	while(i--);
}


// 毫秒级延时
void delay_ms(uint32_t nms)
{
#if 1
	// 168MHz
	while(nms--)
	{
		SysTick->CTRL = 0; 		// 1.关闭系统定时器
		SysTick->LOAD = 168000-1; 	// 2.重装载计数值
		SysTick->VAL = 0; 		// 3.清零当前数值
		SysTick->CTRL = 5; 		// 4.选择168MHz，并打开系统定时器（思考一下，如果需要选择21MHz呢？）
		while((SysTick->CTRL & 0x00010000)==0);	// 5.循环等待计数完毕
		SysTick->CTRL = 0; 		// 6.关闭系统定时器
	}
#else
	// 21MHz
	while(nms--)
	{
		SysTick->CTRL = 0; 		// 1.关闭系统定时器
		SysTick->LOAD = 21000-1; 	// 2.重装载计数值
		SysTick->VAL = 0; 		// 3.清零当前数值
		SysTick->CTRL = 1; 		// 4.选择21MHz，并打开系统定时器
		while((SysTick->CTRL & 0x00010000)==0);	// 5.循环等待计数完毕
		SysTick->CTRL = 0; 		// 6.关闭系统定时器
	}
#endif	
}

// 微秒级延时
void delay_us(uint32_t nus)
{
	// 168MHz
	while(nus--)
	{
		SysTick->CTRL = 0; 		// 1.关闭系统定时器
		SysTick->LOAD = 168-1; 	// 2.重装载计数值
		SysTick->VAL = 0; 		// 3.清零当前数值
		SysTick->CTRL = 5; 		// 4.选择168MHz，并打开系统定时器（思考一下，如果需要选择21MHz呢？）
		while((SysTick->CTRL & 0x00010000)==0);	// 5.循环等待计数完毕
		SysTick->CTRL = 0; 		// 6.关闭系统定时器
	}
}
